Next: Modify Macros, Up: Generalized Variables [Contents][Index]
Several standard (e.g., car) and Emacs-specific
(e.g., window-point) Lisp functions are
setf-able by default. This package defines
setf handlers for several additional functions:
cl-rest cl-subseq cl-get cl-getf cl-caaar…cl-cddddr cl-first…cl-tenth
Note that for cl-getf (as for
nthcdr), the list argument of the function must
itself be a valid place form.
buffer-file-name getenv buffer-modified-p global-key-binding buffer-name local-key-binding buffer-string mark buffer-substring mark-marker current-buffer marker-position current-case-table mouse-position current-column point current-global-map point-marker current-input-mode point-max current-local-map point-min current-window-configuration read-mouse-position default-file-modes screen-height documentation-property screen-width face-background selected-window face-background-pixmap selected-screen face-font selected-frame face-foreground standard-case-table face-underline-p syntax-table file-modes visited-file-modtime frame-height window-height frame-parameters window-width frame-visible-p x-get-secondary-selection frame-width x-get-selection get-register
Most of these have directly corresponding
“set” functions, like use-local-map
for current-local-map, or goto-char
for point. A few, like point-min,
expand to longer sequences of code when they are used with
setf ((narrow-to-region x
(point-max)) in this case).
(substring subplace
n [m]), where subplace
is itself a valid generalized variable whose current value is a
string, and where the value stored is also a string. The new
string is spliced into the specified part of the destination
string. For example:
(setq a (list "hello" "world"))
⇒ ("hello" "world")
(cadr a)
⇒ "world"
(substring (cadr a) 2 4)
⇒ "rl"
(setf (substring (cadr a) 2 4) "o")
⇒ "o"
(cadr a)
⇒ "wood"
a
⇒ ("hello" "wood")
The generalized variable buffer-substring,
listed above, also works in this way by replacing a portion
of the current buffer.
setf is applied to the resulting form.The setf macro takes care to evaluate all
subforms in the proper left-to-right order; for example,
(setf (aref vec (cl-incf i)) i)
looks like it will evaluate (cl-incf i) exactly
once, before the following access to i; the
setf expander will insert temporary variables as
necessary to ensure that it does in fact work this way no matter
what setf-method is defined for aref. (In this case,
aset would be used and no such steps would be
necessary since aset takes its arguments in a
convenient order.)
However, if the place form is a macro which explicitly evaluates its arguments in an unusual order, this unusual order will be preserved. Adapting an example from Steele, given
(defmacro wrong-order (x y) (list 'aref y x))
the form (setf (wrong-order a b)
17) will evaluate b first, then a,
just as in an actual call to wrong-order.
Next: Modify Macros, Up: Generalized Variables [Contents][Index]